package main

import (
	"fmt"
	"math/rand"
)

func main() {
	/*
			1、看下面一段程序，回答问题
			s1 := make([]int, 3, 4)
		    s2 := append(s1, 1)
		请问s1、s2内各有什么元素？
		s1修改一个元素会影响s2吗？s2修改一个元素会影响s1吗？
		s2再增加一个元素会怎么样？
	*/
	/*
		答：s1:[0 0 0],长度为3，容量为4； s2:[0 0 0 1]，由于s2在末尾追加一个1，并没有超出原有容量，没有进行扩容，所以长度为4，容量还是4；
		s2是复制了s1的header，底层数组一样，然后在末尾追加一个元素，但s2的len<=cap，没有进行扩容，所以s1和s2当前共用一个底层数组，由于s1的长度为3，小于s2的长度，所以修改前三个元素，s1和s2都会影响，但是如果s2修改的元素是第4个，不会影响s1；
		s2再增加一个元素，因为len>cap，所以需要扩容，会创建一个新的数组，把原有元素复制进去，再追加一个新的元素，header中的指针更新，指向新的数组地址，len为5，cap翻一倍变成8，至此s2和s1不共用底层数组了，他们的更新也不会互相影响了。
	*/

	/*
		2、有一个数组 [1,4,9,16,2,5,10,15]，生成一个新切片，要求新切片元素是数组相邻2项的和。
	*/
	a1 := []int{1, 4, 9, 16, 2, 5, 10, 15}
	s1 := make([]int, 0, len(a1)-1) //根据题目要求，切片容量为数组长度-1； 如果不清楚切片容量大小，可以初始化一个容量为0的切片，但是会触发扩容 s1:=[]int{}
	for i := 1; i < len(a1); i++ {
		s1 = append(s1, a1[i-1]+a1[i])
	}
	fmt.Println(s1) //[5 13 25 18 7 15 25]

	/*
		3、数字重复统计
		随机产生100个整数
		数字的范围[-100, 100]
		降序输出这些生成的数字并打印其重复的次数
	*/
	a2 := [100]int{}
	for i := 0; i < 100; i++ {
		a2[i] = rand.Intn(201) - 100
	}
	// fmt.Println(a2)
	//TODO：降序输出这些生成的数字并打印其重复的次数

}
